home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1995 January
/
Simtel - 10000 MSDOS Shareware Programs (Walnut Creek)(January 1995)(Disc 2).ISO
/
disc2
/
network
/
fix36.asm
< prev
next >
Wrap
Assembly Source File
|
1988-02-27
|
4KB
|
141 lines
Date: Fri, 19 Feb 88 01:13:04 GMT
From: granroth%iowasp.span@Sds.Sdsc.Edu (Larry Granroth 319/335-1960)
Subject: tenex conversion for the pc
To: info-ibmpc@walker-emh.arpa
The following code may come in handy for people who are having difficulty
FTPing binary files from SIMTEL20 or other TOPS-20 systems to MS-DOS PC's.
The program FIX36 was developed on an XT clone with MASM 4.0. It reads
36-bit groups from standard input and re-packs the data into 32-bit
groups to standard output, removing the 4 extraneous zero bits from each
group.
Larry Granroth
GRANROTH%IOWASP.SPAN@SDS (soon to be GRANROTH@IOWASP.PHYSICS.UIOWA.EDU)
page 54,132
title FIX36: fix image ftp's from tops20 systems
;----------------------------------------------------------------------
;
; FIX36 version 02-18-88 MASM 4.0
; Copyright (c) 1988 by Larry Granroth
; This code may be freely distributed for non-commercial purposes
; only. Modifications to the code may be made as long as they
; are clearly documented.
;
; When doing an image (or binary) type FTP transfer from a TOPS-20
; system, the resulting file contains 32-bit data packed in 36-bit
; groups (each with 4 trailing zero bits).
; This program reads such a file from standard input and
; repacks the data, removing the extraneous bits, to standard
; output. In certain cases, for example VAX/VMS systems running
; CMU TCP/IP software, the creation of an image file will result
; in the file being padded out to an integral number of 512-byte
; blocks. If this file is moved to a PC and processed with FIX36,
; it will still have the extra trailing zeros.
; Note that, if your FTP implementation supports the feature,
; the correct transfer type is "TYPE L 8", in which case this
; program would not be needed.
;
; usage:
; C> fix36 <infile.bin >outfile.bin
;
;----------------------------------------------------------------------
cseg segment para public 'CODE'
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
fix36 proc near
read: mov dx, offset buffer ; ds:dx points to buffer
xor bx,bx ; stdin file handle 0
mov cx,4608 ; number of bytes to read (512*9)
mov ah,3fh ; read function
int 21h ; dos call
jc abort
or ax,ax ; test for zero
jz eof
mov cx,ax ; save number of bytes read
mov si,dx ; ds:si points to first input byte
mov di,dx ; ds:di points to first output byte
cld
first: movs word ptr [di],word ptr [si] ; just move 4 bytes
movs word ptr [di],word ptr [si]
second: lods word ptr [si] ; load next 2 bytes
rol ax,1
rol ax,1
rol ax,1
rol ax,1 ; rotate 4 bits left
mov dx,ax ; save in dx
third: lods word ptr [si] ; load next 2 bytes
mov bx,ax ; save in bx
mov ax,dx ; work on previous 2 bytes
mov dx,bx ; save another copy
shr bl,1
shr bl,1
shr bl,1 ; shift out lower nibble
shr bl,1 ; and position higher nibble
or ah,bl ; put higher nibble where it belongs
stos word ptr [di] ; restore first corrected word
fourth: lods byte ptr [si] ; get 9th byte in cycle
and dl,0fh ; mask out higher nibble
or dl,al ; put in remaining nibble
mov ax,dx ; move back to accumulator
rol ax,1
rol ax,1
rol ax,1
rol ax,1 ; rotate left one nibble
stos word ptr [di] ; restore second corrected word
sub cx,9 ; work with groups of 9 bytes
jg first ; loop if more
jz write
cmp cx,-4 ; this adjusts for a total
jl adjust ; byte count which is not
sub cx,1 ; a multiple of 9
adjust: add di,cx
write: mov dx,offset buffer ; get buffer address
mov cx,di ; output index
sub cx,dx ; number of re-formatted bytes
mov bx,1 ; stdout file handle 1
mov ah,40h ; write function
int 21h ; dos call
jc abort ; abort on error
jmp read ; read another buffer
eof: mov bx,1 ; stdout file handle 1
mov ah,3eh ; close function
int 21h
jc abort
xor al,al ; successful exit code 0
jmp exit
abort: mov si,ax ; save the error code
mov bx,2 ; stderr file handle 2
mov cx,16 ; 16 characters in error message
mov dx,offset errmsg ; ds:dx points to errmsg
mov ah,40h ; write function
int 21h ; dos call
mov ax,si ; original error code in al
exit: mov ah,4ch ; return to dos
int 21h
fix36 endp
errmsg db 13,10,'Fix36 Error',7,13,10
buffer db 4608 dup (?)
cseg ends
end fix36